import type { KnowledgeDetail } from '@/types/knowledge';

/**
 * SQL基础语法知识点数据
 */
export const basicKnowledge: KnowledgeDetail[] = [
	{
		id: 1,
		title: 'SQL数据类型',
		description: 'SQL支持多种数据类型，包括数值型、字符型、日期时间型等，正确选择数据类型是数据库设计的基础。',
		icon: '📊',
		categoryId: 'sql-basic',
		categoryName: 'SQL基础语法',
		categoryIcon: '📝',
		difficulty: '入门',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #2ecc71 0%, #27ae60 100%)',
		keyPoints: [
			{
				point: '数值类型：INT（整数）、BIGINT（大整数）、DECIMAL/NUMERIC（精确小数）、FLOAT/DOUBLE（浮点数）。',
				code: `-- 整数类型
CREATE TABLE products (
    id INT PRIMARY KEY,
    quantity INT,
    price DECIMAL(10, 2),  -- 10位数字，2位小数
    discount FLOAT
);

-- 插入数据
INSERT INTO products VALUES (1, 100, 99.99, 0.15);`
			},
			{
				point: '字符类型：CHAR（固定长度）、VARCHAR（可变长度）、TEXT（长文本）。CHAR会填充空格，VARCHAR按实际长度存储。',
				code: `-- 字符类型
CREATE TABLE users (
    id INT,
    username VARCHAR(50),      -- 可变长度，最多50字符
    status CHAR(1),            -- 固定1字符，如 'Y' 或 'N'
    description TEXT           -- 长文本
);

-- VARCHAR节省空间，CHAR查询更快
INSERT INTO users VALUES (1, 'john_doe', 'Y', 'This is a long description...');`
			},
			{
				point: '日期时间类型：DATE（日期）、TIME（时间）、DATETIME（日期时间）、TIMESTAMP（时间戳）。',
				code: `-- 日期时间类型
CREATE TABLE orders (
    id INT,
    order_date DATE,                    -- 日期：2024-01-15
    order_time TIME,                    -- 时间：14:30:00
    created_at DATETIME,                -- 日期时间：2024-01-15 14:30:00
    updated_at TIMESTAMP                -- 自动更新时间戳
);

-- 插入日期数据
INSERT INTO orders VALUES (
    1, 
    '2024-01-15', 
    '14:30:00', 
    '2024-01-15 14:30:00',
    CURRENT_TIMESTAMP
);`
			},
			{
				point: '布尔类型：BOOLEAN/BOOL，存储TRUE或FALSE。某些数据库用TINYINT(1)或CHAR(1)表示。',
				code: `-- 布尔类型
CREATE TABLE articles (
    id INT,
    title VARCHAR(200),
    is_published BOOLEAN,      -- TRUE 或 FALSE
    is_featured BOOL           -- 同义
);

-- 插入布尔值
INSERT INTO articles VALUES 
    (1, 'Article 1', TRUE, FALSE),
    (2, 'Article 2', FALSE, TRUE);`
			},
			{
				point: '选择数据类型的原则：根据实际需求选择合适类型，避免浪费存储空间，同时保证数据精度和性能。',
				code: `-- 好的设计示例
CREATE TABLE employees (
    id INT PRIMARY KEY,              -- 整数ID
    employee_code VARCHAR(10),       -- 员工编号，可变长度
    name VARCHAR(100),               -- 姓名，可变长度
    age TINYINT,                     -- 年龄，0-255足够
    salary DECIMAL(10, 2),           -- 薪资，精确到分
    hire_date DATE,                  -- 入职日期
    is_active BOOLEAN                -- 是否在职
);

-- 避免过度使用大类型
-- ❌ 错误：age使用INT（浪费空间）
-- ✅ 正确：age使用TINYINT（0-255足够）`
			}
		]
	},
	{
		id: 2,
		title: '创建表（CREATE TABLE）',
		description: 'CREATE TABLE语句用于创建数据库表，需要定义表名、列名、数据类型和约束。',
		icon: '🏗️',
		categoryId: 'sql-basic',
		categoryName: 'SQL基础语法',
		categoryIcon: '📝',
		difficulty: '入门',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #2ecc71 0%, #27ae60 100%)',
		keyPoints: [
			{
				point: '基本语法：CREATE TABLE table_name (column1 datatype, column2 datatype, ...)。',
				code: `-- 创建简单表
CREATE TABLE students (
    id INT,
    name VARCHAR(50),
    age INT,
    email VARCHAR(100)
);`
			},
			{
				point: '定义主键：使用PRIMARY KEY约束，确保每行数据唯一标识。',
				code: `-- 单列主键
CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100)
);

-- 复合主键
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);`
			},
			{
				point: '定义外键：使用FOREIGN KEY建立表间关联，维护引用完整性。',
				code: `-- 创建外键
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    order_date DATE,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 带级联操作的外键
CREATE TABLE order_items (
    id INT PRIMARY KEY,
    order_id INT,
    product_id INT,
    FOREIGN KEY (order_id) REFERENCES orders(id) 
        ON DELETE CASCADE      -- 删除订单时，自动删除订单项
        ON UPDATE CASCADE       -- 更新订单ID时，自动更新订单项
);`
			},
			{
				point: '其他约束：NOT NULL（非空）、UNIQUE（唯一）、CHECK（检查条件）、DEFAULT（默认值）。',
				code: `-- 完整约束示例
CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,           -- 非空
    sku VARCHAR(50) UNIQUE,              -- 唯一
    price DECIMAL(10, 2) CHECK (price > 0), -- 价格必须大于0
    stock INT DEFAULT 0,                 -- 默认值为0
    status VARCHAR(20) DEFAULT 'active'  -- 默认状态
);`
			},
			{
				point: '使用AUTO_INCREMENT自动生成主键值（MySQL）或SERIAL/IDENTITY（PostgreSQL/SQL Server）。',
				code: `-- MySQL AUTO_INCREMENT
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- PostgreSQL SERIAL
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL
);

-- SQL Server IDENTITY
CREATE TABLE users (
    id INT PRIMARY KEY IDENTITY(1,1),  -- 从1开始，每次增加1
    username VARCHAR(50) NOT NULL
);`
			}
		]
	},
	{
		id: 3,
		title: '修改表结构（ALTER TABLE）',
		description: 'ALTER TABLE用于修改已存在的表结构，可以添加、删除、修改列和约束。',
		icon: '🔧',
		categoryId: 'sql-basic',
		categoryName: 'SQL基础语法',
		categoryIcon: '📝',
		difficulty: '入门',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #2ecc71 0%, #27ae60 100%)',
		keyPoints: [
			{
				point: '添加列：ALTER TABLE table_name ADD column_name datatype。',
				code: `-- 添加新列
ALTER TABLE users ADD phone VARCHAR(20);
ALTER TABLE products ADD description TEXT;

-- 添加带约束的列
ALTER TABLE users ADD email VARCHAR(100) NOT NULL;
ALTER TABLE orders ADD total_amount DECIMAL(10, 2) DEFAULT 0;`
			},
			{
				point: '删除列：ALTER TABLE table_name DROP COLUMN column_name。',
				code: `-- 删除列
ALTER TABLE users DROP COLUMN phone;
ALTER TABLE products DROP COLUMN old_field;`
			},
			{
				point: '修改列：可以修改数据类型、约束、默认值等（语法因数据库而异）。',
				code: `-- MySQL修改列
ALTER TABLE users MODIFY email VARCHAR(200);
ALTER TABLE products CHANGE old_name new_name VARCHAR(100);

-- PostgreSQL修改列
ALTER TABLE users ALTER COLUMN email TYPE VARCHAR(200);
ALTER TABLE users ALTER COLUMN email SET NOT NULL;

-- SQL Server修改列
ALTER TABLE users ALTER COLUMN email VARCHAR(200) NOT NULL;`
			},
			{
				point: '添加约束：可以添加主键、外键、唯一约束、检查约束等。',
				code: `-- 添加主键
ALTER TABLE users ADD PRIMARY KEY (id);

-- 添加外键
ALTER TABLE orders 
ADD CONSTRAINT fk_user 
FOREIGN KEY (user_id) REFERENCES users(id);

-- 添加唯一约束
ALTER TABLE users ADD CONSTRAINT uk_email UNIQUE (email);

-- 添加检查约束
ALTER TABLE products 
ADD CONSTRAINT chk_price 
CHECK (price > 0);`
			},
			{
				point: '删除约束：使用DROP CONSTRAINT删除各种约束。',
				code: `-- 删除主键
ALTER TABLE users DROP PRIMARY KEY;

-- 删除外键
ALTER TABLE orders DROP FOREIGN KEY fk_user;

-- 删除唯一约束
ALTER TABLE users DROP CONSTRAINT uk_email;

-- 删除检查约束
ALTER TABLE products DROP CONSTRAINT chk_price;`
			}
		]
	},
	{
		id: 4,
		title: '删除表（DROP TABLE）',
		description: 'DROP TABLE用于删除数据库表，包括表结构和所有数据。',
		icon: '🗑️',
		categoryId: 'sql-basic',
		categoryName: 'SQL基础语法',
		categoryIcon: '📝',
		difficulty: '入门',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #2ecc71 0%, #27ae60 100%)',
		keyPoints: [
			{
				point: '基本语法：DROP TABLE table_name。删除表会同时删除表结构和所有数据，操作不可逆。',
				code: `-- 删除表
DROP TABLE users;
DROP TABLE products;
DROP TABLE orders;`
			},
			{
				point: 'IF EXISTS：在删除前检查表是否存在，避免表不存在时报错。',
				code: `-- 安全删除（如果存在）
DROP TABLE IF EXISTS temp_table;
DROP TABLE IF EXISTS old_data;

-- 避免错误
-- ❌ DROP TABLE non_exist_table;  -- 如果表不存在会报错
-- ✅ DROP TABLE IF EXISTS non_exist_table;  -- 安全删除`
			},
			{
				point: 'CASCADE：级联删除，删除表时同时删除依赖该表的对象（视图、外键等）。',
				code: `-- 级联删除
DROP TABLE users CASCADE;  -- 删除users表及其所有依赖对象

-- PostgreSQL示例
DROP TABLE orders CASCADE;  -- 删除orders表，同时删除引用它的外键约束`
			},
			{
				point: '删除多个表：可以一次删除多个表，用逗号分隔。',
				code: `-- 删除多个表
DROP TABLE table1, table2, table3;

-- 安全删除多个表
DROP TABLE IF EXISTS temp1, temp2, temp3;`
			},
			{
				point: '注意事项：DROP TABLE是危险操作，生产环境应谨慎使用，建议先备份数据。',
				code: `-- 生产环境删除表的标准流程
-- 1. 备份数据
CREATE TABLE users_backup AS SELECT * FROM users;

-- 2. 确认备份成功
SELECT COUNT(*) FROM users_backup;

-- 3. 删除原表
DROP TABLE users;

-- 或者使用事务（某些数据库支持）
BEGIN;
DROP TABLE users;
-- 如果确认无误，COMMIT; 否则 ROLLBACK;`
			}
		]
	},
	{
		id: 5,
		title: '数据库命名规范',
		description: '良好的命名规范可以提高代码可读性和可维护性，是数据库设计的重要原则。',
		icon: '📋',
		categoryId: 'sql-basic',
		categoryName: 'SQL基础语法',
		categoryIcon: '📝',
		difficulty: '入门',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #2ecc71 0%, #27ae60 100%)',
		keyPoints: [
			{
				point: '表名命名：使用复数形式或单数形式（保持一致），使用下划线分隔单词，全小写。',
				code: `-- 推荐的表名
CREATE TABLE users (...);           -- 用户表
CREATE TABLE user_profiles (...);   -- 用户资料表
CREATE TABLE order_items (...);     -- 订单项表
CREATE TABLE product_categories (...); -- 产品分类表

-- 不推荐的命名
-- ❌ User, USER, userTable, user_table_master`
			},
			{
				point: '列名命名：使用小写字母和下划线，名称要有意义，避免缩写（除非是通用缩写）。',
				code: `-- 推荐的列名
CREATE TABLE users (
    id INT,
    user_name VARCHAR(50),        -- 清晰明了
    email_address VARCHAR(100),   -- 完整单词
    created_at TIMESTAMP,         -- 时间戳后缀
    is_active BOOLEAN             -- 布尔值用is_前缀
);

-- 不推荐的命名
-- ❌ uName, emailAddr, crtAt, active`
			},
			{
				point: '主键命名：通常使用id作为主键名，或者使用表名_id的形式。',
				code: `-- 主键命名
CREATE TABLE users (
    id INT PRIMARY KEY,           -- 简单表用id
    ...
);

CREATE TABLE order_items (
    order_item_id INT PRIMARY KEY, -- 复杂表用表名_id
    order_id INT,
    product_id INT
);`
			},
			{
				point: '外键命名：使用fk_表名_列名的形式，或者直接使用被引用表的主键名。',
				code: `-- 外键命名
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,                   -- 引用users表的id
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 或者使用明确的命名
CREATE TABLE orders (
    id INT PRIMARY KEY,
    fk_user_id INT,                -- 明确表示是外键
    FOREIGN KEY (fk_user_id) REFERENCES users(id)
);`
			},
			{
				point: '索引命名：使用idx_表名_列名，唯一索引使用uk_表名_列名，主键索引使用pk_表名。',
				code: `-- 索引命名
CREATE INDEX idx_users_email ON users(email);
CREATE UNIQUE INDEX uk_users_username ON users(username);
CREATE INDEX idx_orders_user_id ON orders(user_id);

-- 复合索引
CREATE INDEX idx_orders_user_date ON orders(user_id, order_date);`
			}
		]
	}
];

